package org.jsola.hr.service;

import org.jsola.core.Page;
import org.jsola.core.service.IService;
import org.jsola.hr.dao.ICustomTemplateDAO;
import org.jsola.hr.dto.CustomDTO;
import org.jsola.hr.dto.CustomTemplateAddDTO;
import org.jsola.hr.dto.CustomTemplateUpdateDTO;
import org.jsola.hr.entity.CustomTemplateDO;
import org.jsola.hr.query.CustomTemplateQuery;
import org.jsola.hr.vo.CustomFieldValueVO;
import org.jsola.hr.vo.CustomTemplateListVO;
import org.jsola.hr.vo.CustomTemplateVO;
import org.jsola.user.core.TokenUser;

import java.util.List;


/**
 * 自定义模板
 *
 * @author zhr
 */
public interface ICustomTemplateService extends IService<ICustomTemplateDAO, CustomTemplateDO> {

    /**
     * 新增自定义模板
     *
     * @param customTemplateAddDTO 新增自定义模板DTO
     * @param tokenUser            当前用户
     * @return 自定义模板详情信息
     */
    CustomTemplateVO save(CustomTemplateAddDTO customTemplateAddDTO, TokenUser tokenUser);


    /**
     * 创建租户级默认模板 如果没有的话
     *
     * @param tokenUser 登录用户
     * @return 租户级默认模板数量
     */
    int saveDefaultBySite(TokenUser tokenUser);

    /**
     * 修改自定义模板
     *
     * @param customTemplateUpdateDTO 修改自定义模板DTO
     * @param tokenUser               当前用户
     * @return 更新数量
     */
    int update(CustomTemplateUpdateDTO customTemplateUpdateDTO, TokenUser tokenUser);

    /**
     * 修改自定义模板 1、租户级选择自定义，所有用工单位花名册新增自定义字段 2、模板可选字段取用花名册 不需要再往花名册同步
     *
     * @param customTemplateUpdateDTO 修改自定义模板DTO
     * @param tokenUser               当前用户
     * @return 更新数量
     */
    int update2(CustomTemplateUpdateDTO customTemplateUpdateDTO, TokenUser tokenUser);


    /**
     * 批量删除自定义模板，物理删除，更新is_valid字段，从回收站删除
     *
     * @param tokenUser         当前用户
     * @param customTemplateIds 自定义模板id
     * @return 删除数量
     */
    int deleteByIds(TokenUser tokenUser, String... customTemplateIds);

    /**
     * 根据自定义模板id查找
     *
     * @param customTemplateId 自定义模板id
     * @param siteId           所属站点id
     * @return 自定义模板详情信息
     */
    CustomTemplateVO selectById(String customTemplateId, String siteId);

    /**
     * 查询自定义模板
     *
     * @param customTemplateQuery 查询条件
     * @param siteId              所属站点id
     * @return 自定义模板列表信息
     */
    List<CustomTemplateListVO> select(CustomTemplateQuery customTemplateQuery, String siteId);

    /**
     * 查询系统默认自定义模板（初始模板）
     *
     * @param name       模板名称
     * @param moduleCode 模板code
     * @return 自定义模板列表信息
     */
    List<CustomTemplateDO> selectBySystem(String name, String moduleCode);

    /**
     * 查询租户下的默认模板
     *
     * @param siteId 站点Id
     * @return 租户下的默认模板
     */
    List<CustomTemplateDO> selectDefaultBySite(String siteId);

    /**
     * 查询租户下所有的默认模板
     *
     * @param siteId 站点Id
     * @return 租户下的默认模板
     */
    List<CustomTemplateDO> selectAllDefaultBySite(String siteId);

    /**
     * 查询租户默认自定义模板
     *
     * @param name       模板名称
     * @param moduleCode 模板code
     * @param tokenUser  当前用户
     * @return 自定义模板列表信息
     */
    List<CustomTemplateDO> selectBySiteId(String name, String moduleCode, TokenUser tokenUser);

    /**
     * 查询用工单位自定义模板
     *
     * @param companyId  用工单位id
     * @param name       模板名称 模糊搜索
     * @param moduleCode 模板code
     * @param tokenUser  当前用户
     * @return 自定义模板列表信息
     */
    List<CustomTemplateDO> selectByCompanyId(String companyId, String name, String moduleCode, TokenUser tokenUser);

    /**
     * 查询用工单位自定义模板
     *
     * @param companyId  用工单位id
     * @param name       模板名称 全匹配
     * @param moduleCode 模板code
     * @param tokenUser  当前用户
     * @return 自定义模板列表信息
     */
    List<CustomTemplateDO> selectByCompanyIdAndName(String companyId, String name, String moduleCode, TokenUser tokenUser);

    /**
     * 查询自定义模板记录数
     *
     * @param customTemplateQuery 查询条件
     * @param siteId              所属站点id
     * @return 自定义模板记录数
     */
    int selectCount(CustomTemplateQuery customTemplateQuery, String siteId);

    /**
     * 分页查询自定义模板；
     *
     * @param customTemplateQuery 查询条件
     * @param tokenUser           当前用户
     * @return 自定义模板列表信息
     */
    Page<CustomTemplateListVO> selectPage(CustomTemplateQuery customTemplateQuery, TokenUser tokenUser);

    /**
     * 查询自定义模板
     *
     * @param name       模板名称
     * @param moduleCode 模块名称
     * @param companyId  用工单位id
     * @param type       类型（租户/用工单位）
     * @param tokenUser  当前用户
     * @return 自定义模板列表信息
     */
    List<CustomTemplateVO> select(String name, String moduleCode, String companyId, Integer type, TokenUser tokenUser);

    /**
     * 根据自定义模板id查找
     *
     * @param customTemplateId 自定义模板id
     * @return 自定义模板
     */
    CustomTemplateDO selectDOById(String customTemplateId);

    /**
     * 查询自定义模板
     *
     * @param customTemplateQuery 查询条件
     * @param siteId              所属站点id
     * @return 自定义模板列表
     */
    List<CustomTemplateDO> selectDO(CustomTemplateQuery customTemplateQuery, String siteId);

    /**
     * 开启模板（关闭已存在的模板）
     *
     * @param companyId  用工单位id
     * @param templateId 模板id
     * @param tokenUser  当前用户
     * @return 成功数量
     */
    int open(String companyId, String templateId, TokenUser tokenUser);

    /**
     * 开启模板（关闭已存在的模板） 模板可选字段直接使用花名册字段 不需要重复保存
     *
     * @param companyId  用工单位id
     * @param templateId 模板id
     * @param tokenUser  当前用户
     * @return 成功数量
     */
    int open2(String companyId, String templateId, TokenUser tokenUser);

    /**
     * 关闭某个模板（只能关闭租户的/用工单位的，此方法不校验）
     *
     * @param templateId 模板id
     * @param tokenUser  当前用户
     * @return 成功数量
     */
    int close(String templateId, TokenUser tokenUser);

    /**
     * 批量关闭模板（只能关闭租户的/用工单位的，此方法不校验）
     *
     * @param templateIdList 模板id
     * @param tokenUser      当前用户
     * @return 成功数量
     */
    int closeByTemplateIdList(List<String> templateIdList, TokenUser tokenUser);

    /**
     * 查询开启的模板（不包含系统默认模板）
     *
     * @param companyId  用工单位id
     * @param moduleCode 模块code
     * @param tokenUser  当前用户
     * @return 开启的模板
     */
    List<CustomTemplateDO> selectOpen(String companyId, String moduleCode, TokenUser tokenUser);

    /**
     * 删除自定义模板
     *
     * @param tokenUser        当前用户
     * @param customTemplateId 自定义模板id
     * @return 删除数量
     */
    int deleteById(TokenUser tokenUser, String customTemplateId);

    /**
     * 新建模板
     *
     * @param customTemplateAddDTO 新建参数
     * @param tokenUser            当前用户
     * @return 新建对象
     */
    CustomTemplateVO saveTemplate(CustomTemplateAddDTO customTemplateAddDTO, TokenUser tokenUser);

    /**
     * 新建模板 可选字段取用花名册,不校验自定义字段
     *
     * @param customTemplateAddDTO 新建参数
     * @param tokenUser            当前用户
     * @return 新建对象
     */
    CustomTemplateVO saveTemplate2(CustomTemplateAddDTO customTemplateAddDTO, TokenUser tokenUser);

    /**
     * 查询同名模板
     *
     * @param name       模板名
     * @param moduleCode 模块code
     * @param companyId  用工单位id
     * @param type       类型（2：租户 3：用工单位）
     * @param isIssue    是否下发 true：是 false：否
     * @param tokenUser  当前用户
     * @return 同名模板
     */
    List<CustomTemplateVO> selectSameNameTemplate(String name, String moduleCode, String companyId, Integer type, Boolean isIssue, TokenUser tokenUser);

    /**
     * 异步下发模板
     *
     * @param customDTO 下发模板参数
     * @param tokenUser 当前用户
     * @return 下发数量
     */
    void asyncIssueTemplate(CustomDTO customDTO, TokenUser tokenUser);

    /**
     * 下发模板
     *
     * @param customDTO 下发模板参数
     * @param tokenUser 当前用户
     * @return 下发数量
     */
    Integer issueTemplate(CustomDTO customDTO, TokenUser tokenUser);

    /**
     * 下发模板 不区分是否默认 统一下发左侧可选字段与右侧已选字段
     *
     * @param customDTO 下发模板参数
     * @param tokenUser 当前用户
     * @return 下发数量
     */
    Integer issueTemplate2(CustomDTO customDTO, TokenUser tokenUser);

    /**
     * 异步下发模板 不区分是否默认 统一下发左侧可选字段与右侧已选字段
     *
     * @param customDTO 下发模板参数
     * @param tokenUser 当前用户
     */
    void asyncIssueTemplate2(CustomDTO customDTO, TokenUser tokenUser);

    /**
     * 下发租户的可选自定义信息到所有用工单位
     */
    void issuedAllAdditionalFields();

    /**
     * 下发全部租户的默认模板到所有用工单位 (前提是用工单位没有自己创建默认模板)
     */
    void issuedAllAdditionalFields2();

    /**
     * 下发指定租户的默认模板到用工单位 (没有指定用工单位 则下发所有用工单位 强制更新)
     *
     * @param templateId 模板Id
     * @param companyIds 指定用工单位
     * @param tokenUser  用工单位id
     */
    void issuedAllAdditionalFields3(String templateId, List<String> companyIds, TokenUser tokenUser);

    /**
     * 修复预登记的自定义字段 companyId=site,moduleType=checkIn,templateId=list
     */
    void repairCheckIn();


    /**
     * 修复租户级花名册基本字段 从系统级中创建
     */
    void repairNecessary();

    /**
     * 修复租户级自定义字段
     */
    void repairSiteAdditionalFields(String siteId);

    /**
     * 查询开启的模板（包含系统默认模板，自定义字段被替换为templateId=null的记录id）
     *
     * @param moduleCode 模块code
     * @param companyId  用工单位id
     * @param tokenUser  当前用户
     * @return 开启的模板
     */
    CustomTemplateVO selectOpenTemplate(String moduleCode, String companyId, TokenUser tokenUser);

    /**
     * 查询开启的模板 已选自定义字段在花名册中 取消在可选字段中校验
     *
     * @param moduleCode 模块code
     * @param companyId  用工单位id
     * @param tokenUser  当前用户
     * @return 开启的模板
     */
    CustomTemplateVO selectOpenTemplate2(String moduleCode, String companyId, TokenUser tokenUser);

    /**
     * 批量确认到岗表单
     *
     * @param moduleCode 模块code
     * @param companyId  用工单位id
     * @param tokenUser  当前用户
     * @return 开启的模板
     */
    CustomTemplateVO selectOpenTemplate3(String moduleCode, String companyId, TokenUser tokenUser);

    /**
     * 获取预登记自定义字段值
     *
     * @param checkInId 预登记人员id
     * @param tokenUser 当前用户
     * @return 自定义字段值
     */
    CustomFieldValueVO getCheckInField(String checkInId, TokenUser tokenUser);

    /**
     * 获取入职/待入职自定义字段值
     *
     * @param empId      员工id
     * @param moduleType 模块类型
     * @param tokenUser  当前用户
     * @return 自定义字段值
     */
    CustomFieldValueVO getEmpField(String empId, String moduleType, TokenUser tokenUser);
}


